<?php

namespace App\Miya\UIData;

use App\Miya\Models\Info;
use App\Miya\Models\InfoType;
use Illuminate\Database\Eloquent\ModelNotFoundException;

class InfoData extends CommonData
{
    protected $name = 'info';
    protected $fields = [
        'id', 'module_id', 'classify_id', 'name', 'keyword_id',
        'avatar', 'content', 'tag', 'images', 'is_delayed',
        'delayed_at', 'custom_keywords', 'extends', 'page_views', 'created_at'
    ];

    /**
     * 通过信息id获取信息详情
     * @param $id 信息id
     *
     * @operate 直接调用
     *
     * @data id 信息id
     * @data module 对应模块信息 id:模块id tag:模块标签 name:模块名称
     * @data classify 对应分类信息 id:分类id tag:分类标签 name:分类名称
     * @data name 信息名称
     * @data keyword 分类关键词信息 id:关键词id keyword:关键词
     * @data avatar 信息封面度
     * @data content 信息内容
     * @data tag 信息标签
     * @data images 信息图片列表
     * @data custom_keywords 信息自定义关键词
     * @data extends 拓展信息列表 单个调用建议使用array_get
     * @data page_views 访问量
     * @data type_list 属性信息列表
     * @data time 信息时间
     * @data url() 信息超链接
     * @data sketch() 信息内容的部分简略信息 默认100
     * @data parseTime('Y-m-d H:i:s') 格式化信息时间
     */
    public function get($id): Info
    {
        return $this->dataCache(function () use ($id) {
            $info = Info::select($this->fields)
                ->with(Info::$DefaultRelationships)
                ->where('status', 1)
                ->where(function ($query) {
                    $query->where('is_delayed', 2)->orWhere(function ($query) {
                        $query->where('is_delayed', 1)->where('delayed_at', '<=', now());
                    });
                })->find($id);

            if (!$info) {
                $msg = sprintf('信息中未找到id为 %s 的数据信息', $id);
                throw new ModelNotFoundException($msg);
            }

            $info->avatar && $info->avatar = asset('uploads/' . $info->avatar);
            $info->images = array_map(function ($img) {
                return asset('uploads/' . $img);
            }, $info->images);
            $info->keywords = $info->getKeywords();
            return $info;
        }, __METHOD__, $id);
    }

    /**
     * 通过信息tag获取信息详情
     * @param $tag 信息tag
     *
     * @operate 直接调用
     *
     * @data id 信息id
     * @data module 对应模块信息 id:模块id tag:模块标签 name:模块名称
     * @data classify 对应分类信息 id:分类id tag:分类标签 name:分类名称
     * @data name 信息名称
     * @data keyword 分类关键词信息 id:关键词id keyword:关键词
     * @data avatar 信息封面度
     * @data content 信息内容
     * @data tag 信息标签
     * @data images 信息图片列表
     * @data custom_keywords 信息自定义关键词
     * @data extends 拓展信息列表 单个调用建议使用array_get
     * @data page_views 访问量
     * @data type_list 属性信息列表
     * @data time 信息时间
     * @data url() 信息超链接
     * @data sketch() 信息内容的部分简略信息 默认100
     * @data parseTime('Y-m-d H:i:s') 格式化信息时间
     */
    public function getByTag($tag): Info
    {
        return $this->dataCache(function () use ($tag) {
            $info = Info::select($this->fields)
                ->with(Info::$DefaultRelationships)
                ->where('status', 1)
                ->where(function ($query) {
                    $query->where('is_delayed', 2)->orWhere(function ($query) {
                        $query->where('is_delayed', 1)->where('delayed_at', '<=', now());
                    });
                })->whereTag($tag)->first();

            if (!$info) {
                $msg = sprintf('信息中未找到tag为 %s 的数据信息', $tag);
                throw new ModelNotFoundException($msg);
            }

            $info->avatar && $info->avatar = asset('uploads/' . $info->avatar);
            $info->images = array_map(function ($img) {
                return asset('uploads/' . $img);
            }, $info->images);
            $info->keywords = $info->getKeywords();
            return $info;
        }, __METHOD__, $tag);
    }

    /**
     * 通过属性获取信息列表
     * @param $hash 属性值的hash字符串
     * @param $num 需要的信息数量
     * @param $classify_id 分类id
     *
     * @operate 遍历后调用
     *
     * @data id 信息id
     * @data module 对应模块信息 id:模块id tag:模块标签 name:模块名称
     * @data classify 对应分类信息 id:分类id tag:分类标签 name:分类名称
     * @data name 信息名称
     * @data keyword 分类关键词信息 id:关键词id keyword:关键词
     * @data avatar 信息封面度
     * @data content 信息内容
     * @data tag 信息标签
     * @data images 信息图片列表
     * @data custom_keywords 信息自定义关键词
     * @data extends 拓展信息列表
     * @data page_views 访问量
     * @data type_list 属性信息列表
     * @data time 信息时间
     * @data url() 信息超链接
     * @data sketch() 信息内容的部分简略信息 默认100
     * @data parseTime('Y-m-d H:i:s') 格式化信息时间
     */
    public function getInfosByType($hash, $num = 5, $classify_id = null)
    {
        return $this->dataCache(function () use ($hash, $num, $classify_id) {
            $type = InfoType::with(['module'])->whereValue($hash)->first();
            //如果未找到对应的info_types信息 则表示无此属性,直接返回[];
            if (!$type) {
                return [];
            }

            $builder = Info::where('status', 1)->select($this->fields)
                ->with(Info::$DefaultRelationships)
                ->has('types')->whereHas('types', function ($query) use ($hash) {
                    $query->where('value', $hash);
                })->where(function ($query) {
                    $query->where('is_delayed', 2)->orWhere(function ($query) {
                        $query->where('is_delayed', 1)->where('delayed_at', '<=', now());
                    });
                })->where(function ($query) use ($classify_id) {
                    if ($classify_id) {
                        $query->where('classify_id', $classify_id);
                    }
                });

            $builder = Info::rankByType($builder, $type->module->info_rank_type);
            $infos = $builder->take($num)->get();

            $infos = $infos->map(function ($info) {
                $info->avatar && $info->avatar = asset('uploads/' . $info->avatar);
                $info->images = array_map(function ($img) {
                    return asset('uploads/' . $img);
                }, $info->images);
                $info->keywords = $info->getKeywords();
                return $info;
            });

            return $infos;
        }, __METHOD__, sprintf('%s_%s', $hash, $num));
    }
}
